// 数字
let a: number = 100;

// 字符串
let b: string;
b = '字符串'

// 布尔值
let c: boolean = true;
console.info(typeof c)

// 隐式声明
let d = 1000
console.info(typeof d)

// 字面量申明
let e: true;
console.info(typeof e)

// 多个类型
let f: boolean | string;
f = true
console.info(typeof f)
f = '字符串'
console.info(typeof f)

// 任意类型 any
let g: any
console.info(typeof g)

// 未知类型 unknown
let h: unknown
h = 100.11
console.info(typeof h)

// 类型断言
let j: number
// 方式一：as
j = h as number
// 方式二：<>
j = <number>h
console.info(j);

// void 返回值不存在，可以返回 null、undefined、不写
function f1(): void {
    console.log('return type : void')
    return
}

// 必须有返回值
function f2(a: number, b: number): number {
    return 0
}

// 不会有任何返回值 never
function f3(): never {
    throw new Error("never")
}

// 对象类型
// 属性? 可选属性
// [name: string]: any 任意类型的属性
let l: { name: string, sex: number, flag?: boolean, [name: string]: any };
// 赋值
l = {name: '孙悟空', sex: 12, ext: '扩展'}
console.log(l)


// 函数类型
let m: (a: number, b: number) => number
// 赋值函数
m = (a, b) => a + b
// 调用函数
console.log(m(100, 10))


// 数组
let n: number[]
n = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
console.log(typeof n)

// 元组
let o: [string, number]
o = ['admin', 0]

// 枚举
enum SexEnum {
    FEMALE,
    MALE
}

// 使用枚举
let p: { name: string, sex: SexEnum }
p = {name: '小米', sex: SexEnum.MALE}
console.log(p)